package pe.com.fastfood4.rie.dao;

import pe.com.fastfood4.rie.model.Cliente;

import java.util.List;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.simple.ParameterizedRowMapper;
import org.springframework.jdbc.core.simple.SimpleJdbcDaoSupport;

/**
 * ClienteDaoImpl.java es la implementacion de ClienteDao.java
 * @author grupo 06 - upc_dew 2010
 */
public class ClienteDaoImpl extends SimpleJdbcDaoSupport implements ClienteDao {

    //protected final Log logger = LogFactory.getLog(getClass());

    /** envia datos de cliente nuevo a la BD */
    public void registrarCliente(Cliente cliente) {
	logger.info("Saving Cliente: " + cliente.getNombres());
	int count = getSimpleJdbcTemplate().update(
            "insert into Clientes (idCliente, nombres, apellidoPaterno, apellidoMaterno, password, dni, telefono, direccion, email) " +
            "values(:idCliente, :nombres, :apellidoPaterno, :apellidoMaterno, :password, :dni, :telefono, :direccion, :email)",
            new MapSqlParameterSource()
                .addValue("idCliente", cliente.getIdCliente())
                .addValue("nombres", cliente.getNombres())
                .addValue("apellidoPaterno", cliente.getApellidoPaterno())
                .addValue("apellidoMaterno", cliente.getApellidoMaterno())
                .addValue("password", cliente.getPassword())
                .addValue("dni", cliente.getDni())
                .addValue("telefono", cliente.getTelefono())
                .addValue("direccion", cliente.getDireccion())
                .addValue("email", cliente.getEmail())
        );
	logger.info("Rows affected: " + count);
    }

    /** Obtiene listado de clientes registrados en la BD */
    public List<Cliente> getClientes() {
        logger.info("Obteniendo clientes!");
        List<Cliente> clientes = getSimpleJdbcTemplate().query(
            "select idCliente, nombres, apellidoPaterno, apellidoMaterno, email from Clientes",
            new ClienteMapper());
        return clientes;
    }

    /** Obtiene el codigo de ultimo cliente registrado */
    public int getUltimoIdCliente() {
        logger.info("Obteniendo ultimo idCliente!");
        int ultimoIdCliente = getSimpleJdbcTemplate().queryForInt(
            "select distinct idCliente from Clientes where idCliente = (select max(idCliente) from Clientes)");
        return ultimoIdCliente;
    }

    private static class ClienteMapper implements ParameterizedRowMapper<Cliente> {

        public Cliente mapRow(ResultSet rs, int rowNum) throws SQLException {
            Cliente cliente = new Cliente();
            cliente.setIdCliente(rs.getInt("idCliente"));
            cliente.setNombres(rs.getString("nombres"));
            cliente.setApellidoPaterno(rs.getString("apellidoPaterno"));
            cliente.setApellidoMaterno(rs.getString("apellidoMaterno"));
            cliente.setEmail(rs.getString("email"));
            return cliente;
        }
    }

    /** obtiene cliente por codigo de cliente (idCliente) */
    public Cliente getClientePorIdCliente(String idCliente) {
        Cliente cliente = null;
        Connection connection = null;
        Statement st = null;
        ResultSet rs = null;
        try {
            connection = ConnectionUtils.getConnection();
            st = connection.createStatement();
            rs = st.executeQuery("select * from Clientes where idCliente='" + idCliente + "'");
            if (rs.next()) {
                cliente = new Cliente();
                cliente.setIdCliente(rs.getInt("idCliente"));
                cliente.setNombres(rs.getString("nombres"));
                cliente.setApellidoPaterno(rs.getString("apellidoPaterno"));
                cliente.setApellidoMaterno(rs.getString("apellidoMaterno"));
                cliente.setPassword(rs.getString("password"));
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            ConnectionUtils.closeResultSet(rs);
            ConnectionUtils.closeStatement(st);
            ConnectionUtils.closeConnection(connection);
        }
        return cliente;
    }
}
